题目分析
最长回文子串问题是一个经典的字符串处理问题,这道题有四种不同的解决思路,当然它们的时间复杂度和空间复杂度也都不相同。
暴力法
暴力法很好理解,遍历所有子串,需要$O(n^2)$的时间复杂度,每个子串比较是否为回文串,需要O(n)的时间复杂度,因此总的时间复杂度为$O(n^3)$,空间复杂度上,如果使用一个临时变量存储子串则需要O(n),如果直接使用索引则空间复杂度为O(1),使用临时变量思路更加清晰,在这里我就使用O(n)的空间复杂度。
1 | class Solution: |
DP
DP是(Dynamic Programming,动态规划)的简称,动态规划的核心问题是如何建立状态转移方程,而本题有一个天然的状态,即回文状态,如果某个字符串是回文字符串,那么去掉首尾的一个字符,仍然满足回文字符串,因此可以容易的建立状态转移方程,其时间复杂度为$O(n^2)$,空间复杂度也是$O(n^2)$。
有关DP的知识可以参考我的另一篇博客动态规划(Dynamic Programming)。
1 | class Solution: |
中心扩展算法
中心扩展算法不是一类通用算法,是针对于特定回文字符串的问题的解法,分析如下图,时间复杂度为$O(n^2)$,如果采用一个临时变量存储子串则需要O(n),如果直接使用索引则空间复杂度为O(1),使用临时变量思路更加清晰,在这里我就使用O(n)的空间复杂度。
1 | class Solution: |
manacher(马拉车)算法
马拉车算法是专门解决回文字符串的问题,其算法的时间复杂度和空间复杂度都可以缩小到O(n)的量级,在长字符串中具有非常显著的优势。
1 | class Solution: |
刷题总结
马拉车算法是解决最长回文串的最佳方法,在面试中问到回文串,如果能答出马拉车算法,那是非常给力的,但是动态规划的方法大家也要学会,因为动态规划问题也是面试常考的知识点之一。